Análisis de Datos I
Tarea 1
Ejercicio 1
Complete todas las demostraciones que quedaron pendientes en la presentación de la clase.
Librerías
Primeramente, se cargan las librerías necesarias.
Ejercicio 2
Desarrolle una función R que recibe un DataFrame y dos números de columna y que retorna el nombre de las variables correspondientes a las columnas, la covarianza y la correlación entre esas dos variables.
A continuación se muestra el código desarrollado para la creación de la función en R.
escanear <- function(dataframe, columna1, columna2){
nombre_variables <- vector(length = 2)
nombre_variables[1] <- colnames(dataframe)[columna1]
nombre_variables[2] <- colnames(dataframe)[columna2]
covarianza <- cov(dataframe[, columna1], dataframe[, columna2])
correlacion <- cor(dataframe[, columna1], dataframe[, columna2])
return(list(nombre_variables = nombre_variables, covarianza = covarianza,
correlación = correlacion))
}La función llamada escanear recibe un dataframe, el nombre de la primer columna que se desea y el de la segunda. Se crea un vector para almacenar los nombres de las variables. Luego se le asigna a cada uno de los espacios del vector el nombre de la variables, extraídos por medio de la función colnames( ). Seguidamente, se utilizan las funciones cov( ) para la covarianza y cor( ) para la correlación.
Como se puede observar la función retorna una lista donde el primer elemento es un vector con los nombres de las variables correspondientes a las columnas ingresadas, el segundo elemento es la covarianza entre las dos variables y el último es la correlación de las mismas.
Una vez hecha la función se decide hacer la siguiente prueba para corroborar.
## $nombre_variables
## [1] "ceniza_volatil" "super_plastificante"
##
## $covarianza
## [1] 144.3225
##
## $correlación
## [1] 0.3775031
Ejercicio 3
Programe la siguiente función recursiva:
A continuación se muestra el código desarrollado para la creación de la función recursiva.
U_n <- function(n){
if(n == 0){
resultado <- 5
} else if(n == 1){
resultado <- -5
} else if(n == 2){
resultado <- 2
} else{
resultado <- 4*U_n(n-1) - 15*U_n(n-2) + U_n(n-3)
}
return(resultado)
}La función recibe un n el cual especifica el valor que se desea calcular. Con el uso de los condicionales se crean los casos posibles de cada valor. Note que cuando n es mayor o igual a tres, debido a la recursividad, el resultado vuelve a ejecutar la función pero con los valores anteriores. Por último, la función retorna el resultado correspondiente.
Para corroborar el buen funcionamiento se decide hacer una prueba con los 11 primeros valores de la recursión.
## U_ 0 = 5
## U_ 1 = -5
## U_ 2 = 2
## U_ 3 = 88
## U_ 4 = 317
## U_ 5 = -50
## U_ 6 = -4867
## U_ 7 = -18401
## U_ 8 = -649
## U_ 9 = 268552
## U_ 10 = 1065542
Ejercicio 4
En este ejercicio utilizaremos la tabla de datos concreto.csv, la cual contiene mediciones de los distintos componentes de una estructura de concreto. El concreto es el material más importante en la ingeniería civil.
Primeramente, se carga la base de datos
Seguidamente, se realiza un análisis exploratorio de los datos para conocer ciertas características y comportamientos de la información con la que contamos.
Primero, es necesario identificar el tipo de datos que son. A continuación se muestra dicha información:
## spc_tbl_ [1,030 × 9] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ cemento : num [1:1030] 540 540 332 332 199 ...
## $ escoria : num [1:1030] 0 0 142 142 132 ...
## $ ceniza_volatil : num [1:1030] 0 0 0 0 0 0 0 0 0 0 ...
## $ agua : num [1:1030] 162 162 228 228 192 228 228 228 228 228 ...
## $ super_plastificante : num [1:1030] 2.5 2.5 0 0 0 0 0 0 0 0 ...
## $ agregado_grueso : num [1:1030] 1040 1055 932 932 978 ...
## $ agregado_fino : num [1:1030] 676 676 594 594 826 ...
## $ edad : num [1:1030] 28 28 270 365 360 90 365 28 28 28 ...
## $ resistencia_compresion: num [1:1030] 80 61.9 40.3 41 44.3 ...
## - attr(*, "spec")=
## .. cols(
## .. cemento = col_double(),
## .. escoria = col_double(),
## .. ceniza_volatil = col_double(),
## .. agua = col_double(),
## .. super_plastificante = col_double(),
## .. agregado_grueso = col_double(),
## .. agregado_fino = col_double(),
## .. edad = col_double(),
## .. resistencia_compresion = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
## # A tibble: 6 × 9
## cemento escoria ceniza_volatil agua super_plastificante agregado_grueso
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 540 0 0 162 2.5 1040
## 2 540 0 0 162 2.5 1055
## 3 332. 142. 0 228 0 932
## 4 332. 142. 0 228 0 932
## 5 199. 132. 0 192 0 978.
## 6 266 114 0 228 0 932
## # ℹ 3 more variables: agregado_fino <dbl>, edad <dbl>,
## # resistencia_compresion <dbl>
Como se puede observar, todas la variables son de tipo númerico.
Segundo, se verifica si existen outliers entre las variables. Es decir, si se presentan valores atípicos que se alejan del resto de los datos.Para esto, es útil construir las cajas de bigotes correspondiente a cada variable ya que, nos permiten visualizar de manera sencilla si existen estos tipos de datos.
Entonces,transformamos el dataframe para obtener uno con variables categóricas de la siguiente manera:
## values ind
## 1 540.0 cemento
## 2 540.0 cemento
## 3 332.5 cemento
## 4 332.5 cemento
## 5 198.6 cemento
## 6 266.0 cemento
Con lo anterior, se construyen las cajas de bigotes para cada variable:
boxplot(stacked_concreto$values ~ stacked_concreto$ind,
col = rainbow(ncol(concreto)), xlab = "Variables", ylab ="y")Se puede observar que la variable edad y agua son los que presentan más outiliers (3 y 4 respectivamente). También, ciertos valores atípicos de la variable de edad se encuentran considerablemente lejanos al resto de los datos. Sin embargo, no se proceden a eliminar pues, el outlier más alto es 365 días lo cuál, considerando la definición de esta variable y las propiedades del concreto es un valor que se debe tomar en cuenta. En el caso de las otras variables que poseen outliers, estos se encuentra no muy lejos de los límites de la caja y otros están muy cercanos al límite superior o inferior como es el caso de agua. Por ende, tampoco se eliminan pues, no se consideran datos muy lejanos del resto o que no tienen sentido y no representan un problema para el cálculo de ciertos estadísticos como la media o correlaciones.
También, se presenta un resumen númerico de las variables de la base de datos que brinda información como la media, máximo, mínimo entre otros.
## cemento escoria ceniza_volatil agua
## Min. :102.0 Min. : 0.0 Min. : 0.00 Min. :121.8
## 1st Qu.:192.4 1st Qu.: 0.0 1st Qu.: 0.00 1st Qu.:164.9
## Median :272.9 Median : 22.0 Median : 0.00 Median :185.0
## Mean :281.2 Mean : 73.9 Mean : 54.19 Mean :181.6
## 3rd Qu.:350.0 3rd Qu.:142.9 3rd Qu.:118.30 3rd Qu.:192.0
## Max. :540.0 Max. :359.4 Max. :200.10 Max. :247.0
## super_plastificante agregado_grueso agregado_fino edad
## Min. : 0.000 Min. : 801.0 Min. :594.0 Min. : 1.00
## 1st Qu.: 0.000 1st Qu.: 932.0 1st Qu.:731.0 1st Qu.: 7.00
## Median : 6.400 Median : 968.0 Median :779.5 Median : 28.00
## Mean : 6.205 Mean : 972.9 Mean :773.6 Mean : 45.66
## 3rd Qu.:10.200 3rd Qu.:1029.4 3rd Qu.:824.0 3rd Qu.: 56.00
## Max. :32.200 Max. :1145.0 Max. :992.6 Max. :365.00
## resistencia_compresion
## Min. : 2.33
## 1st Qu.:23.71
## Median :34.45
## Mean :35.82
## 3rd Qu.:46.13
## Max. :82.60
Además, como parte del análisis exploratorio vamos a identificar qué tipo de densidad paramétrica se aproxima mejor a la variable resistencia_comprension mediante el criterio AIC.
El criterio de información de Akaike (AIC) es una medida de la calidad de un modelo dentro de un conjunto de modelos. Brinda información sobre la complejidad de un modelo y su exactitud, pues describe el sesgo y la varianza presentes en el modelo estadístico en estudio. Con el AIC, se permite determinar cuál modelo es el más apropiado entre los modelos estadísticos propuestos. Como criterio de selección, se considera como mejor modelo aquel cuyo valor de AIC es menor. Se debe tener presente que el AIC no es prueba de hipótesis, por lo que no indica si un modelo es de calidad, es decir, todos los modelos pueden ser erróneos y el AIC solo indica entre ellos cúal es el que mejor se ajusta.
Para realizar dicho análisis se emplean dos métodos:
Método 1
model_select(concreto$resistencia_compresion, models = univariateML_models, criterion = "aic",
na.rm = FALSE)## Maximum likelihood estimates for the Weibull model
## shape scale
## 2.285 40.473
Según el resultado, la densidad que mejor se ajusta es la Weibull pues, presenta el menor valor de AIC.
Método 2
## logL AIC BIC Chisq(value) Chisq(p) AD(value) H(AD)
## Normal -4361.23 8726.46 8736.34 81.69 0.00 4.08 rejected
## Cauchy -4560.32 9124.64 9134.52 327.48 0.00 15.70 rejected
## Logistic -4377.78 8759.56 8769.44 90.25 0.00 3.90 rejected
## Exponential -4715.8 9433.61 9438.54 693.82 0.00 126.54 rejected
## Chi-square -5333.76 10669.52 10674.45 49565.74 0.00 285.28 NULL
## Uniform NULL NULL NULL Inf 0.00 Inf NULL
## Gamma -4343.13 8690.26 8700.14 63.61 0.00 3.93 rejected
## Lognormal -4398.98 8801.96 8811.83 144.82 0.00 12.55 rejected
## Weibull -4324.92 8653.85 8663.72 38.88 0.04 0.77 rejected
## F -6127.29 12258.57 12268.45 6499.35 0.00 469.32 NULL
## Student -6914.81 13831.62 13836.56 15068.56 0.00 946.81 NULL
## Gompertz -4374.32 8752.65 8762.52 114.10 0.00 9.09 NULL
## KS(value) H(KS)
## Normal 0.04 not rejected
## Cauchy 0.11 rejected
## Logistic 0.04 not rejected
## Exponential 0.24 rejected
## Chi-square 0.21 rejected
## Uniform 0.08 rejected
## Gamma 0.06 rejected
## Lognormal 0.09 rejected
## Weibull 0.03 not rejected
## F 0.56 rejected
## Student 0.76 rejected
## Gompertz 0.06 rejected
##
## Chosen continuous distribution is: NA
## Fitted parameters are:
## [1] NA
Mediante el criterio AIC, la densidad Weibull también es la que mejor se ajusta a los datos de resistencia_comprension
Por ende, con ambos métodos se determina que la densidad paramétrica que presenta mejor ajuste con la variable es la Weibull.
En el siguiente gráfico se puede observar cómo es el ajuste.
fw <- fitdist(concreto$resistencia_compresion, "weibull")
par(mfrow = c(2,2))
denscomp(fw, legendtext = "Weibull")
qqcomp(fw, legendtext = "Weibull")
cdfcomp(fw, legendtext = "Weibull")
ppcomp(fw, legendtext = "Weibull")Por último, se realiza un gráfico de correlaciones para identificar cúal variable se correlaciona mejor con la variable resistencia_comprension
A partir del gráfico se puede observar que la variable que mejor se
correlaciona con resistencia_comprension es cemento pues, se puede ver
que el gráfico de dispersión correspondiente es que el presenta una
forma más lineal en comparación con el resto. Además, el coeficiente de
correlación positiva es la más alta. Lo cual, significa que conforme una
variable aumenta la otra también.
Ejercicio 5
En este ejercicio usaremos la tabla de datos que viene en el archivo toyota price.csv. Este es un conjunto de datos de autos usados de la marca Toyota, donde se presentan distintas propiedades del vehículo y su correspondiente precio de venta.
Se carga la base de datos y se ignora la columna con la variable ‘modelo’.
Se muestra un resumen de la base cargada.
## 'data.frame': 6737 obs. of 8 variables:
## $ año : num 2016 2017 2015 2017 2017 ...
## $ precio : num 16000 15995 13998 18998 17498 ...
## $ transmision : Factor w/ 4 levels "","Automatic",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ kilometraje : num 24089 18615 27469 14736 36284 ...
## $ tipo_combustible : Factor w/ 4 levels "","Diesel","Hybrid",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ impuesto_circulacion: num 265 145 265 150 145 260 145 145 150 265 ...
## $ mpg : num 36.2 36.2 36.2 36.2 36.2 36.2 36.2 36.2 33.2 36.2 ...
## $ tamaño_motor : num 2 2 2 2 2 2 2 2 2 2 ...
## año precio transmision kilometraje tipo_combustible impuesto_circulacion
## 1 2016 16000 Manual 24089 Petrol 265
## 2 2017 15995 Manual 18615 Petrol 145
## 3 2015 13998 Manual 27469 Petrol 265
## 4 2017 18998 Manual 14736 Petrol 150
## 5 2017 17498 Manual 36284 Petrol 145
## 6 2017 15998 Manual 26919 Petrol 260
## mpg tamaño_motor
## 1 36.2 2
## 2 36.2 2
## 3 36.2 2
## 4 36.2 2
## 5 36.2 2
## 6 36.2 2
Se genera un resumen numérico para la variable precio y se crea un boxplot con el fin de analizar posible valores atípicos.
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 850 8250 10795 12497 14995 54991 105
Como se puede ver en el resumen, la media de los datos está en 12497, el mínimo en 850 y el máximo en 54991. Sin embargo, gracias al gráfico boxplot se puede notar que existen una gran cantidad de posibles valores atípicos. Una posible interpretación a esto, es que, al tratarse de precios de autos, Toyota como empresa cuenta con múltiples modelos con precios variados y al ser los autos con precios más accesibles los de mayor demanda y aquellos con precios elevados los menos adquiridos por el público general, estos últimos se vuelven compras atípicas al compararse con todas las demás.
Ahora, con el objetivo de realizan una matriz de correlación se omiten las variables de tipo categórico.
## precio kilometraje impuesto_circulacion mpg tamaño_motor
## 1 16000 24089 265 36.2 2
## 2 15995 18615 145 36.2 2
## 3 13998 27469 265 36.2 2
## 4 18998 14736 150 36.2 2
## 5 17498 36284 145 36.2 2
## 6 15998 26919 260 36.2 2
Se genera una matriz de correlación.
Como se puede observar en la matriz de correlaciones, los dos pares de variables con mayores coeficientes de correlación fuerte positiva fueron el tamaño del motor con el precio del vehículo y el impuesto por circulación con el precio nuevamente. Una de las posibles explicaciones para la primera relación es que un motor más grande implica un mayor costo de producción para Toyota por lo que se debe subir el precio del auto para cubrir esos costos aumentados. Por otro lado, la posible explicación para la relación entre el impuesto de circulación con el precio del vehículo es que los autos con precios más altos tienen por ley, una mayor carga impositiva, lo que implica que, a mayor precio mayor el monto a pagar por impuesto de circulación.